﻿using System;
using System.Collections.Generic;
using System.Text;
//new
using System.Xml;
using JRCore.tools;
using System.Xml.Serialization;
using System.IO;

namespace JRCore.protocol
{
    /// <summary>
    /// 杰瑞数据转发协议V3.1
    /// </summary>
    [Serializable]
    public class PicCenterPush
    {
        /// <summary>
        /// 参数个数
        /// </summary>
        [XmlIgnore]
        public const int N = 53;

        /// <summary>
        /// 参数集合
        /// </summary>
        [XmlIgnore]
        public string[] P;

        /// <summary>
        /// 协议版本号
        /// </summary>
        [XmlElement("P1")]
        public string P1
        {
            get { return P[0]; }
            set { P[0] = value; }
        }

        /// <summary>
        /// 图片组序号(必须),该组图片的序号
        /// </summary>
        [XmlElement("P2")]
        public string P2
        {
            get { return P[1]; }
            set { P[1] = value; }
        }

        /// <summary>
        /// 一组图片数量(必须),1,2,3（不包括车牌图，车标图，人脸图）
        /// </summary>
        [XmlElement("P3")]
        public string P3
        {
            get { return P[2]; }
            set { P[2] = value; }
        }

        /// <summary>
        /// 图片合成模式(必须),0-不合成 1-合成
        /// </summary>
        [XmlElement("P4")]
        public string P4
        {
            get { return P[3]; }
            set { P[3] = value; }
        }

        /// <summary>
        /// 记录类型(必须),0-正常，1-低速，2-超速，3-逆行，4-闯红灯，5-压车道线，6-不按导向，7-路口滞留，8-机占非，9-违法变道，10-机动车违反规定使用专用车道，11-黄牌车禁限，12-监控抓拍，13-绿灯停车，14-未礼让行人，15-违章停车，16-违章掉头，17-占用应急车道，18-禁右，19-禁左，20-压黄线，21-未系安全带，22-行人闯红灯，23-加塞，24-打手机，25-抽烟，26-挡遮阳板
        /// </summary>
        [XmlElement("P5")]
        public string P5
        {
            get { return P[4]; }
            set { P[4] = value; }
        }

        /// <summary>
        /// 数据提供厂家(必须),本数据的提供厂家（JARI），其他厂家按约定。
        /// </summary>
        [XmlElement("P6")]
        public string P6
        {
            get { return P[5]; }
            set { P[5] = value; }
        }

        /// <summary>
        /// 采集方式(必须),1:闯红灯自动记录设备2:公路车辆智能监控设备3:测速设备4:闭路电视5:移动摄像6:数码相机7:区间测速8:卫星定位装置9:其它电子设备11:群众举报
        /// </summary>
        [XmlElement("P7")]
        public string P7
        {
            get { return P[6]; }
            set { P[6] = value; }
        }

        /// <summary>
        /// 设备编号(必须),采集设备的唯一标识编号
        /// </summary>
        [XmlElement("P8")]
        public string P8
        {
            get { return P[7]; }
            set { P[7] = value; }
        }

        /// <summary>
        /// 采集人员(可选),当“5记录类型为”为“12监控抓拍”时指定采集人员用户名，没有设为空。
        /// </summary>
        [XmlElement("P9")]
        public string P9
        {
            get { return P[8]; }
            set { P[8] = value; }
        }

        /// <summary>
        /// 违法行为代码(可选),本记录对应的违法行为代码，没有设为空。
        /// </summary>
        [XmlElement("P10")]
        public string P10
        {
            get { return P[9]; }
            set { P[9] = value; }
        }

        /// <summary>
        /// 路口国标编号(必须),路口的国标代码，城区道路9位，省道国道12位，如：600232001
        /// </summary>
        [XmlElement("P11")]
        public string P11
        {
            get { return P[10]; }
            set { P[10] = value; }
        }

        /// <summary>
        /// 部门编号(必须),交警部门行政编号，如：320700000000
        /// </summary>
        [XmlElement("P12")]
        public string P12
        {
            get { return P[11]; }
            set { P[11] = value; }
        }

        /// <summary>
        /// 行政区划(必须),所属行政区划，如：320705
        /// </summary>
        [XmlElement("P13")]
        public string P13
        {
            get { return P[12]; }
            set { P[12] = value; }
        }

        /// <summary>
        /// 路口厂家编号(必须),路口的厂家编号
        /// </summary>
        [XmlElement("P14")]
        public string P14
        {
            get { return P[13]; }
            set { P[13] = value; }
        }

        /// <summary>
        /// 路口名称(必须),路口名称（不能含有_字符）
        /// </summary>
        [XmlElement("P15")]
        public string P15
        {
            get { return P[14]; }
            set { P[14] = value; }
        }

        /// <summary>
        /// 方向(必须),1-由东向西 2-由南向北 3-由西向东 4-由北向南
        /// </summary>
        [XmlElement("P16")]
        public string P16
        {
            get { return P[15]; }
            set { P[15] = value; }
        }

        /// <summary>
        /// 车道(必须),由路口渠化由中间线到路边依次为1,2,3,4,5…
        /// </summary>
        [XmlElement("P17")]
        public string P17
        {
            get { return P[16]; }
            set { P[16] = value; }
        }

        /// <summary>
        /// 经过时间(必须),格式为：yyyyMMddHHmmssfff，一组图片中取识别车牌的那张图片时间
        /// </summary>
        [XmlElement("P18")]
        public string P18
        {
            get { return P[17]; }
            set { P[17] = value; }
        }

        /// <summary>
        /// 红灯开始时间(可选),格式为：yyyy-MM-dd HH:mm:ss，由检测器给出时间 
        /// </summary>
        [XmlElement("P19")]
        public string P19
        {
            get { return P[18]; }
            set { P[18] = value; }
        }

        /// <summary>
        /// 红灯持续时间(可选),单位：秒，由检测器给出时间
        /// </summary>
        [XmlElement("P20")]
        public string P20
        {
            get { return P[19]; }
            set { P[19] = value; }
        }

        /// <summary>
        /// 号牌种类(可选),01:大型汽车02:小型汽车03:使馆汽车04:领馆汽车05:境外汽车06:外籍汽车07:普通摩托车08:轻便摩托车09:使馆摩托车10:领馆摩托车11:境外摩托车12:外籍摩托车13:低速车14:拖拉机15:挂车16:教练汽车17:教练摩托车18:试验汽车19:试验摩托车20:临时入境汽车21:临时入境摩托车22:临时行驶车23:警用汽车24:警用摩托25:原农机号牌26:香港入出境车27:澳门入出境车99:其他
        /// </summary>
        [XmlElement("P21")]
        public string P21
        {
            get { return P[20]; }
            set { P[20] = value; }
        }

        /// <summary>
        /// 车牌颜色(可选),蓝 黄 白 黑，没有为空字符串
        /// </summary>
        [XmlElement("P22")]
        public string P22
        {
            get { return P[21]; }
            set { P[21] = value; }
        }

        /// <summary>
        /// 车牌号(可选),车牌的汉字、大写字母和数字部分，未识别到车牌时，车牌为空字符串，挂车，警车，教练车要去掉车牌尾部的“挂，警，学”
        /// </summary>
        [XmlElement("P23")]
        public string P23
        {
            get { return P[22]; }
            set { P[22] = value; }
        }

        /// <summary>
        /// 车身颜色(可选),0-其他色 1-白色 2-银色 3-灰色 4-黑色 5-红色 6-深蓝7-蓝色 8-黄色 9-绿色 10-棕色 11-粉色 12-紫色，没有为空字符串
        /// </summary>
        [XmlElement("P24")]
        public string P24
        {
            get { return P[23]; }
            set { P[23] = value; }
        }

        /// <summary>
        /// 车辆长度(可选),单位厘米，没有为空字符串
        /// </summary>
        [XmlElement("P25")]
        public string P25
        {
            get { return P[24]; }
            set { P[24] = value; }
        }

        /// <summary>
        /// 限速(可选),无限速为空字符串
        /// </summary>
        [XmlElement("P26")]
        public string P26
        {
            get { return P[25]; }
            set { P[25] = value; }
        }

        /// <summary>
        /// 车速(可选),无车速为空字符串
        /// </summary>
        [XmlElement("P27")]
        public string P27
        {
            get { return P[26]; }
            set { P[26] = value; }
        }

        /// <summary>
        /// 数据标识(必须),图片数据是否上传，0-不上传1-上传，不上传数据时，图片区不用上传。
        /// </summary>
        [XmlElement("P28")]
        public string P28
        {
            get { return P[27]; }
            set { P[27] = value; }
        }

        /// <summary>
        /// 图片服务器IP(必须),图片所在服务器IP地址
        /// </summary>
        [XmlElement("P29")]
        public string P29
        {
            get { return P[28]; }
            set { P[28] = value; }
        }

        /// <summary>
        /// 文件路径1,图片1路径，当“数据标识”为0时为必须项(KAKOU和WFCLXT)如G:\KK\人民路\2015\03\01\123.jpg当“数据标识”为1时，为空字符串。
        /// </summary>
        [XmlElement("P30")]
        public string P30
        {
            get { return P[29]; }
            set { P[29] = value; }
        }

        /// <summary>
        /// 文件路径2(可选),图片2的文件系统全路径
        /// </summary>
        [XmlElement("P31")]
        public string P31
        {
            get { return P[30]; }
            set { P[30] = value; }
        }

        /// <summary>
        /// 文件路径3(可选),图片3的文件系统全路径
        /// </summary>
        [XmlElement("P32")]
        public string P32
        {
            get { return P[31]; }
            set { P[31] = value; }
        }

        /// <summary>
        /// 文件路径4(可选),图片4的文件系统全路径
        /// </summary>
        [XmlElement("P33")]
        public string P33
        {
            get { return P[32]; }
            set { P[32] = value; }
        }

        /// <summary>
        /// 文件路径5(可选),车牌图片的文件系统全路径
        /// </summary>
        [XmlElement("P34")]
        public string P34
        {
            get { return P[33]; }
            set { P[33] = value; }
        }

        /// <summary>
        /// 文件路径6(可选),车标图片的文件系统全路径
        /// </summary>
        [XmlElement("P35")]
        public string P35
        {
            get { return P[34]; }
            set { P[34] = value; }
        }

        /// <summary>
        /// 文件路径7,人脸图片的文件系统全路径
        /// </summary>
        [XmlElement("P36")]
        public string P36
        {
            get { return P[35]; }
            set { P[35] = value; }
        }

        /// <summary>
        /// 网络路径1,图片1网络路径，当“数据标识”为0时为必须项(AITMS) 如：http://172.16.22.2/KK/人民路/2015/03/01/123.jpg当“数据标识”为1时，为空字符串。 
        /// </summary>
        [XmlElement("P37")]
        public string P37
        {
            get { return P[36]; }
            set { P[36] = value; }
        }

        /// <summary>
        /// 网络路径2(可选),图片2网络路径
        /// </summary>
        [XmlElement("P38")]
        public string P38
        {
            get { return P[37]; }
            set { P[37] = value; }
        }

        /// <summary>
        /// 网络路径3(可选),图片3网络路径
        /// </summary>
        [XmlElement("P39")]
        public string P39
        {
            get { return P[38]; }
            set { P[38] = value; }
        }

        /// <summary>
        /// 网络路径4(可选),图片4网络路径
        /// </summary>
        [XmlElement("P40")]
        public string P40
        {
            get { return P[39]; }
            set { P[39] = value; }
        }

        /// <summary>
        /// 网络路径5(可选),车牌图片网络路径
        /// </summary>
        [XmlElement("P41")]
        public string P41
        {
            get { return P[40]; }
            set { P[40] = value; }
        }

        /// <summary>
        /// 网络路径6(可选),车标图片网络路径
        /// </summary>
        [XmlElement("P42")]
        public string P42
        {
            get { return P[41]; }
            set { P[41] = value; }
        }

        /// <summary>
        /// 网络路径7(可选),人脸图片网络路径
        /// </summary>
        [XmlElement("P43")]
        public string P43
        {
            get { return P[42]; }
            set { P[42] = value; }
        }

        /// <summary>
        /// 预留1(可选),车辆类型,
	    /// "Motor" 机动车		   
	    /// "Non-Motor"非机动车		
	    /// "Bus"公交车		
	    /// "Bicycle" 自行车		
	    /// "Motorcycle"摩托车		
	    /// "UnlicensedMotor": 无牌机动车
	    /// "LargeCar"  大型汽车
	    /// "MicroCar" 小型汽车
	    /// "EmbassyCar" 使馆汽车
	    /// "MarginalCar" 领馆汽车
	    /// "AreaoutCar" 境外汽车
	    /// "ForeignCar" 外籍汽车
	    /// "DualTriWheelMotorcycle"两、三轮摩托车
	    /// "LightMotorcycle" 轻便摩托车
	    /// "EmbassyMotorcycle "使馆摩托车
	    /// "MarginalMotorcycle "领馆摩托车
	    /// "AreaoutMotorcycle "境外摩托车
	    /// "ForeignMotorcycle "外籍摩托车
	    /// "FarmTransmitCar" 农用运输车
	    /// "Tractor" 拖拉机
	    /// "Trailer"  挂车
	    /// "CoachCar"教练汽车
	    /// "CoachMotorcycle "教练摩托车
	    /// "TrialCar" 试验汽车
	    /// "TrialMotorcycle "试验摩托车
	    /// "TemporaryEntryCar"临时入境汽车
	    /// "TemporaryEntryMotorcycle"临时入境摩托车
	    /// "TemporarySteerCar"临时行驶车
	    /// "PassengerCar" 客车
	    /// "LargeTruck" 大货车
	    /// "MidTruck" 中货车
	    /// "SaloonCar" 轿车
	    /// "Microbus"面包车
	    /// "MicroTruck"小货车
	    /// "Tricycle"三轮车
	    /// "Passerby" 行人
        /// </summary>
        [XmlElement("P44")]
        public string P44
        {
            get { return P[43]; }
            set { P[43] = value; }
        }

        /// <summary>
        /// 预留2(可选),车辆品牌，
        /// "Unknown"未知 
        /// "Audi" 奥迪
        /// "Honda" 本田
        /// "Buick" 别克
        /// "Volkswagen" 大众
        /// "Toyota" 丰田
        /// "BMW" 宝马
        /// "Peugeot" 标致
        /// "Ford" 福特
        /// "Mazda" 马自达
        /// "Nissan" 尼桑
        /// "Hyundai" 现代
        /// "Suzuki" 铃木
        /// "Citroen" 雪铁龙
        /// "Benz" 奔驰
        /// "BYD" 比亚迪
        /// "Geely" 吉利
        /// "Lexus" 雷克萨斯
        /// "Chevrolet" 雪佛兰
        /// "Chery" 奇瑞
        /// "Kia" 起亚
        /// "Charade" 夏利
        /// "DF" 东风
        /// "Naveco" 依维柯
        /// "SGMW" 五菱
        /// "Jinbei" 金杯
        /// </summary>
        [XmlElement("P45")]
        public string P45
        {
            get { return P[44]; }
            set { P[44] = value; }
        }

        /// <summary>
        /// 预留3(可选)，车牌坐标：left，top，right，bottom
        /// </summary>
        [XmlElement("P46")]
        public string P46
        {
            get { return P[45]; }
            set { P[45] = value; }
        }

        /// <summary>
        /// 预留4(可选)
        /// </summary>
        [XmlElement("P47")]
        public string P47
        {
            get { return P[46]; }
            set { P[46] = value; }
        }

        /// <summary>
        /// 预留5(可选)
        /// </summary>
        [XmlElement("P48")]
        public string P48
        {
            get { return P[47]; }
            set { P[47] = value; }
        }

        /// <summary>
        /// 预留6(可选)
        /// </summary>
        [XmlElement("P49")]
        public string P49
        {
            get { return P[48]; }
            set { P[48] = value; }
        }

        /// <summary>
        /// 预留7(可选)
        /// </summary>
        [XmlElement("P50")]
        public string P50
        {
            get { return P[49]; }
            set { P[49] = value; }
        }

        /// <summary>
        /// 预留8(可选)
        /// </summary>
        [XmlElement("P51")]
        public string P51
        {
            get { return P[50]; }
            set { P[50] = value; }
        }

        /// <summary>
        /// 预留9(可选)
        /// </summary>
        [XmlElement("P52")]
        public string P52
        {
            get { return P[51]; }
            set { P[51] = value; }
        }

        /// <summary>
        /// 预留10(可选)
        /// </summary>
        [XmlElement("P53")]
        public string P53
        {
            get { return P[52]; }
            set { P[52] = value; }
        }

        /// <summary>
        /// PicCenterPush构造
        /// </summary>
        public PicCenterPush()
        {
            P = new string[N];
            for (int i = 0; i < N; i++)
            {
                P[i] = "";
            }
        }

        /// <summary>
        /// 转化为Xml
        /// </summary>
        /// <returns></returns>
        public string ToXml()
        {
            string ans = "";
            MemoryStream ms = null;
            try
            {
                if (P != null)
                {
                    XmlSerializerNamespaces nss = new XmlSerializerNamespaces();
                    nss.Add("", "");//去除根节点的namespace内容
                    XmlWriterSettings set = new XmlWriterSettings();
                    set.Encoding = new UTF8Encoding(false);
                    set.Indent = true;

                    ms = new MemoryStream();
                    using (XmlWriter xmlWriter = XmlWriter.Create(ms, set))
                    {
                        XmlSerializer xz = new XmlSerializer(typeof(PicCenterPush));
                        xz.Serialize(xmlWriter, this, nss);
                    }
                    ans = Encoding.UTF8.GetString(ms.ToArray());
                    ms.Close();
                    ms.Dispose();
                }
            }
            catch (Exception er)
            {
                if (ms != null)
                {
                    ms.Close();
                    ms.Dispose();
                }
                ans = "";
                Console.WriteLine("PicCenterPush.ToXML()" + er.Message);
            }
            return ans;
        }

        /// <summary>
        /// 对象转换为bytes用于TCP发送
        /// </summary>
        /// <returns>内存数组</returns>
        public byte[] ToBytes()
        {
            byte[] ans = null;
            try
            {
                ans = Encoding.UTF8.GetBytes(ToXml());
            }
            catch (Exception er)
            {
                ans = null;
                Console.WriteLine("PicCenterPush.ToBytes()" + er.Message);
            }
            return ans;
        }

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="p">参数</param>
        /// <returns>PicCenterPush对象</returns>
        public static PicCenterPush Parse(string[] p)
        {
            PicCenterPush ans = null;
            try
            {
                if ((p != null) && (p.Length == N))
                {
                    ans = new PicCenterPush();
                    ans.P = p;
                }
            }
            catch (Exception er)
            {
                ans = null;
                Console.WriteLine("PicCenterPush.Parse()" + er.Message);
            }
            return ans;
        }

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="txt">字符串形式</param>
        /// <returns>PicCenterPush对象</returns>
        public static PicCenterPush Parse(string txt)
        {
            PicCenterPush ans = null;
            try
            {
                if ((txt != null) && (txt != ""))
                {
                    string[] ss = txt.Split('_');
                    if ((ss != null) && (ss.Length == N))
                    {
                        ans = new PicCenterPush();
                        ans.P = ss;
                    }
                }
            }
            catch (Exception er)
            {
                ans = null;
                Console.WriteLine("PicCenterPush.Parse()" + er.Message);
            }
            return ans;
        }

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="data">byte[]形式</param>
        /// <returns>PicCenterPush对象</returns>
        public static PicCenterPush Parse(byte[] data)
        {
            PicCenterPush ans = null;
            MemoryStream ms = null;
            try
            {
                ms = new MemoryStream(data);
                XmlSerializer z = new XmlSerializer(typeof(PicCenterPush));
                ans = (PicCenterPush)z.Deserialize(ms);
            }
            catch (Exception er)
            {
                ans = null;
                Console.WriteLine("PicCenterPush.Parse()" + er.Message);
            }
            finally
            {
                if (ms != null)
                {
                    ms.Close();
                    ms.Dispose();
                }
            }
            return ans;
        }
    }
}
